If we use a regular idle watch, any session inhibitors can prevent the
watch from triggering, leading to the break manager to never consider
the break as having been completed until the inhibitor is gone. This
could lead to situations in which the system appears to be stuck with
a dimmed screen.
Also start the idle time when the idle watch is created, otherwise any
previous idle time would count towards it, causing the watch to trigger
early, leaving it inconsistent with the rest of the break manager state.
Florian Müllner [Fri, 31 Oct 2025 17:14:14 +0000 (18:14 +0100)]
js: Use one-shot idle/timeout functions
gjs now provides overrides for GLib's one-shot idle/timeout
functions, so use them to save a bit of code and clearly
indicate that a callback is only invoked once.
Florian Müllner [Fri, 31 Oct 2025 17:13:54 +0000 (18:13 +0100)]
extensions-app: Use one-shot idle/timeout functions
gjs now provides overrides for GLib's one-shot idle/timeout
functions, so use them to save a bit of code and clearly
indicate that a callback is only invoked once.
Jonas Ådahl [Fri, 3 Oct 2025 15:02:37 +0000 (17:02 +0200)]
status/keyboard: Adapt to external source of keyboard layout
This adapts to API changes that allow an external source (e.g. remote
desktop API user) to control the current keyboard layout. This is done
in two ways:
If the external keyboard source sets the keymap as "locked", the
indicator is fixed to the short name of the external source, and will
change the indicator label when the layout index is changed accordingly.
The builtin input sources are not selectable, and the keyboard selection
keybinding is disabled.
If the external keyboard source doesn't set the keymap as "locked",
whenever the current keymap is from an external source, it's indicated
as a non-sensitive but selected input source. Selecting another keyboard
layout overrides the one selected by the external entity.
gdm/util: Set minimum display time for authentication messages
Short messages like "PIN locked" were previously displayed for only
480ms (10 chars × 48ms), making them impossible to read. Ensure all
messages are shown for at least 2 seconds.
Ramez Medhat [Wed, 21 Jan 2026 15:28:22 +0000 (17:28 +0200)]
quickSettingsMenu: Add actor group to focus manager
This allows focus to menu item using the tab key to match the behaviour in other menus.
Closes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/8904
Jan200101 [Sun, 25 Jan 2026 21:33:49 +0000 (22:33 +0100)]
shell-app: Improve discrete GPU detection
The original logic only took into account if a GPU is the "Default",
meaning the GPU used during boot, which was intended for Laptops with
Hybrid Graphics.
The new logic uses the new Discrete key to figure out which GPU is the
most appropriate to use in order of:
- the first non-default GPU if it is discrete
- the first discrete GPU if it exists
- the first non-default GPU
Milan Crha [Tue, 13 Jan 2026 16:49:27 +0000 (17:49 +0100)]
endSessionDialog: Remove unused UPGRADE_RESTART dialog data
The gnome-software D-Bus OfflineUpdates API does not distinguish
between offline updates and offline upgrades, thus the UPGRADE_RESTART
dialog data are not used and can be dropped.
Milan Crha [Tue, 13 Jan 2026 13:45:32 +0000 (14:45 +0100)]
endSessionDialog: Switch from PackageKit offline updates API to gnome-software
Let the endSessionDialog depend on gnome-software when deciding whether
any offline updates are scheduled and what to after applying them,
instead of using PackageKit, which is not included in distributions
using rpm-ostree and similar.
Another advantage is rather than implementing similar calls for various
package managers and systems in gnome-shell, these implementations should
go into the gnome-software, which should know about them already.
Sebastian Keller [Sat, 24 Jan 2026 17:15:43 +0000 (18:15 +0100)]
appDisplay: Only create default folders on the first start
If all folders were removed, after a session restart the default folders
would have been recreated again, effectively preventing users from
using the app grid without folders.
Avoid this problem by only creating the default folders if the
folder-children setting has never been modified before.
Sebastian Keller [Wed, 21 Jan 2026 18:50:33 +0000 (19:50 +0100)]
st/spinner-content: Fix CoglTexture leak
Most of the members were getting indirectly freed via the
st_spinner_content_set_actor (spinner, NULL) and the subsequent
st_spinner_content_invalidate () on destruction of the actor or
changing of its content when the spinner is stopped.
The texture however was not freed.
This now frees all members explicitly on finalize.
208 (96 direct, 112 indirect) bytes in 1 blocks are definitely lost in loss record 20,960 of 22,464
at 0x4D37833: g_type_create_instance (gtype.c:1877)
by 0x4D1C186: g_object_new_internal.part.0 (gobject.c:2666)
by 0x4D1E0FA: g_object_new_internal (gobject.c:2982)
by 0x4D1E0FA: g_object_new_valist (gobject.c:3004)
by 0x4D1E488: g_object_new (gobject.c:2479)
by 0x5A8B7CB: _cogl_texture_2d_create_base (cogl-texture-2d.c:84)
by 0x572D668: st_spinner_content_paint_content (st-spinner-content.c:175)
by 0x50D2C07: clutter_actor_paint_node (clutter-actor.c:3471)
by 0x50D2C07: clutter_actor_continue_paint (clutter-actor.c:3726)
by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)
by 0x50D9717: clutter_actor_paint (clutter-actor.c:3670)
by 0x574199A: st_viewport_paint (st-viewport.c:483)
by 0x50D2C42: clutter_actor_continue_paint (clutter-actor.c:3728)
by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)
Carlos Garnacho [Wed, 8 Oct 2025 17:11:37 +0000 (19:11 +0200)]
panel: Use click gesture to trigger window dragging from panel
This gesture is set up on the target phase, in order to ensure only button
presses on the panel itself (and not actors within it) are handled as window
drags.
Carlos Garnacho [Tue, 30 Dec 2025 12:24:41 +0000 (13:24 +0100)]
workspaceAnimation: Perform a grab during workspace switch gestures
Currently, the mechanism to reclaim touch input from clients and into
the gesture is somewhat indirect:
- The swipeTracker gesture(s) will enter in a recognized state
- The MetaGestureTracker will notice the recognized state on a gesture
set up in the ClutterStage actor, and emit META_SEQUENCE_ACCEPTED
on the sequence
- The core will notice the sequence being accepted and call
meta_display_cancel_touch()/meta_wayland_touch_cancel()
- This eventually results in wl_touch.cancel on the affected client(s)
This is a bit too convoluted and special cased, so claim input using
a more traditional way: Using a Clutter grab. This will also result in
touch being cancelled on the Wayland side. This will happen along with
other input, but that's actually a consistence improvemente, since the
other method would not prevent other input (e.g. pointer) while the
workspace gesture is ongoing. This results in glitchy behavior if
multiple input devices are used simultaneously.
Carlos Garnacho [Wed, 5 Nov 2025 11:41:02 +0000 (12:41 +0100)]
pointerA11yTimeout: Set the cursor through ClutterActor API
Set the cursor on the stage. This differs with the "root" cursor
approach in that actors with a non-inherited cursor (e.g. I-beam on
text actors) will stick to that instead of showing the cursor as
set here.
If that's turns out not to be enough, might make sense to move this
piece of a11y feedback to Mutter.
Allow org.freedesktop.Malcontent.SessionLimits.Extend action id when
screen is locked, so it's possible to show polkit authentication dialogs
on lock screen for parental controls session limits integration in the
future.
Update org.freedesktop.MalcontentTimer1.Child interface to include the
new screen time extensions functionality.
The interface has been updated from https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/main/libmalcontent-timer/org.freedesktop.MalcontentTimer1.Child.xml,
and it has not been modified after being copied.
Carlos Garnacho [Mon, 24 Nov 2025 16:16:57 +0000 (17:16 +0100)]
shellDBus: Add new BrightnessChanged signal to brightness interface
This does actually track user-triggered changes, so other pieces
(i.e. gsd-power) can react to this. This will help in reintroducing
brightness re-normalization when brightness is driven by ALS sensors.
Carlos Garnacho [Tue, 23 Dec 2025 14:09:09 +0000 (15:09 +0100)]
layout: Drop fallback for hot corner without barriers
The BARRIER backend capability was been moot for a long time since
XInput 2.4 became widespread and barriers became commonplace. And
even further recently with the removal of the X11 backend. The
native backend has always implemented barriers.
It seems we can drop this fallback handling. Since the _entered flag
was only used in those paths, the leave event vfunc is unnecessary too.
Florian Müllner [Thu, 19 Dec 2019 22:07:55 +0000 (23:07 +0100)]
environment: Add async ease variants
Ease functions can be used nested, and often need to complete before
performing an action.
This is currently handled by providing onComplete/onStopped callbacks,
which can get tedious when nesting.
To make these cases more convenient, add async variants that return
a promise that is resolved when the transition completes, so that
callers can await the result instead.
In case the transition was interrupted, the promise is rejected with a
CANCELLED error, so that it stops a promises chain and can easily be
filtered out in catch handlers.
revisto [Wed, 17 Dec 2025 21:13:47 +0000 (00:43 +0330)]
calendar: Center align "No Notifications" text
The "No Notifications" placeholder was left-aligned instead of
centered, which looked unbalanced in the empty notification state.
Fix by centering the label.
Make the parental controls session limits related variables and
functions have more specific names, more representative of their
contents and function.
timeLimitsManager: Factor out wellbeing-daily-limit-enabled
Factor out wellbeing-daily-limit-enabled specific for the wellbeing
screen time limits functionality to a separate function, which will make
it easier in the future to make the daily-limit-enabled property also
handle parental controls session limits functionality.
Adrian Vovk [Thu, 13 Nov 2025 19:01:20 +0000 (14:01 -0500)]
data: Overhaul systemd units
This simplifies the structure of the systemd units, since we no longer
support running with X11. But it also allows us to pass in the
gnome-shell session mode via systemd.
This removes the need for GDM to have any special code to handle the
GNOME_SHELL_SESSION_MODE environment variable, and allows GNOME sessions
to specify directly what session mode they need without the involvement
of GDM. This makes it trivial to define custom gnome-session sessions
that use custom gnome-shell session modes.
Sessions that consist entirely of a gnome-shell mode (like the
gnome-classic session) will need to do a little more legwork to define
themselves as proper gnome-session sessions.
revisto [Tue, 16 Dec 2025 15:58:59 +0000 (19:28 +0330)]
status/volume: Use default color for muted microphone indicator
The muted indicator status is currently hard to distinguish from the
unmuted one. As there is no privacy concern when muted, don't apply
the privacy-indicator styling in that state so the states become
more distinct.